feat: [EPIC-GW-04] 搭建网络访问面骨架 (HTTP/WS/SSE)#312
Conversation
|
/review |
Codecov Report❌ Patch coverage is 📢 Thoughts on this report? Let us know! |
1. 安全收敛:移除 CORS 全局放行,引入严格的 Origin 白名单(仅限 localhost/app 协议),并同步防御 WebSocket 跨站握手劫持 (CSRF)。 2. 稳定性修复:移除 WS 循环中死板的 ReadTimeout,防止纯接收型健康长连接被误杀。 3. 健壮性增强:为每个 WS 连接绑定独立的 context.CancelFunc,在连接异常或服务关停时精准中断下游 Runtime 任务,彻底杜绝协程泄漏。 4. 测试达标:补齐网络面边缘用例断言,模块覆盖率稳居 95% 以上。
|
/review |
处理 Code Review 的最后边缘场景反馈,进一步提升网络访问面的一致性与系统健壮性: 1. 网络一致性修复:将 IPv6 环回地址 (http://[::1]) 及其带端口的形态正式纳入 CORS 与 WebSocket 的 Origin 校验白名单。修复了网关允许绑定 IPv6 却拦截其同源请求的自相矛盾问题。 2. 状态机逻辑修正:修复 TUI infra 层的本地剪贴板读取逻辑。当剪贴板无图片内容时,正确返回空状态 (nil, nil) 而非抛出“该平台不支持”的异常,避免上游 TUI 抛出错误告警。 3. 文档契约对齐:在 README.md 网络端点章节补充详尽的 Origin 安全白名单声明(限 localhost / 127.0.0.1 / [::1] / app://),消除未来第三方前端接入时的调试盲区。 4. 测试同步:同步更新网络面跨域测试与 infra 层断言用例,网关核心覆盖率稳居 95.3%。
|
/review |
| cmd.Flags().StringVar( | ||
| &options.HTTPAddress, | ||
| "http-listen", | ||
| gateway.DefaultNetworkListenAddress, |
There was a problem hiding this comment.
--http-listen defaults to fixed 127.0.0.1:8080, and the command now treats network listener failure as fatal for the whole gateway startup. This is a behavioral regression vs prior IPC-only startup: if 8080 is occupied, gateway cannot start at all. Consider making network listener opt-in, defaulting to :0, or degrading gracefully when only the network plane fails.
| if normalizedHost == "" { | ||
| return fmt.Errorf("invalid --http-listen %q: host must be loopback", address) | ||
| } | ||
| if strings.EqualFold(normalizedHost, "localhost") { |
There was a problem hiding this comment.
Loopback validation currently accepts localhost without resolving it. That weakens the "loopback-only" guarantee because hostname resolution can be environment-dependent. Recommend either requiring literal loopback IPs only, or resolving hostname and verifying every resolved address is loopback before accepting.
| `http://localhost`、`http://127.0.0.1`、`http://[::1]` 以及 `app://` 前缀来源连入; | ||
| 非允许来源的跨域调用会被拦截并返回 `403`。 | ||
|
|
||
| URL Scheme 派发骨架命令(EPIC-GW-02A): |
There was a problem hiding this comment.
Docs say only allowlisted origins are allowed, but implementation permits requests with empty Origin (including WS handshake with no origin). Please clarify this in README (e.g. "allowlist applies to requests that include Origin") or tighten server behavior to match current wording.
解决网络层边缘状态与可用性问题,保障本地核心服务的极高存活率: 1. 优雅降级 (Graceful Degradation):解耦网络面与核心 IPC 通道的生命周期。当 HTTP 监听失败(如 8080 端口冲突被占用)时,不再触发进程 Fatal,而是转为输出 Warning 告警,确保网关底层 IPC 继续为本地应用提供服务。 2. 严格的环回校验 (Loopback Resolution):消除了原先仅依赖字符串比对 localhost 的安全盲区。现引入真实的 DNS 解析,强制验证域名对应的所有 IP 均为 Loopback 地址,防御特定环境下的解析污染。 3. 契约文档对齐 (Docs):在 README 中明确注明 Origin 安全拦截机制的生效范围。澄清了非浏览器客户端(如 cURL、Postman、本地后端脚本)等不携带 Origin 头的请求会被正常放行,消除调用方的调试疑虑。
🎯 目标 (Motivation & Context)
本 PR 落地了网关重构计划的第四步 [EPIC-GW-04]。 为了让 NeoCode 能够作为底座服务于未来的 Web UI、富文本 TUI 等多模态客户端,我们在原有的 IPC 控制面之外,平行增加了一套 网络访问面 (Network Access Plane)。
💡 MVP 设计原则说明:
127.0.0.1:8080,利用操作系统 Loopback 机制进行物理隔离,本期暂不引入复杂的 Token 鉴权体系。Closes #304
✨ 主要变更 (Key Changes)
1. 三端点网络骨架 (
internal/gateway/network_server.go)gateway.ping)实现了触发即订阅及自动心跳保活。2. 核心架构解耦与复用 (
internal/gateway/rpc_dispatch.go)rpc_dispatch.go分发器。3. 工程化与治理基线 (Governance)
OPTIONS预检请求,为前端直连铺平道路。sync.Mutex维护长连接池,当进程收到终止信号时,主动切断所有休眠的 WS/SSE 阻塞 I/O,确保neocode gateway能够极速退出。4. 🧹 Chore: TUI Infra 测试修复
internal/tui/infra中clipboard与image模块在多平台 CI 下的 flaky 测试遗留问题。✅ 验收标准 (Acceptance Criteria)
--http-listen参数,网关可同时启动 IPC 与 HTTP 服务而不互相阻塞。curl POST /rpc可成功调用gateway.ping并获得标准响应。0.0.0.0等非 Loopback 地址时,被安全策略明确拒绝。🧪 测试与验证结果 (Verification)
网络面核心逻辑(包含连接生命周期管理、CORS、长短连接收发)单元测试全量覆盖。
go test ./...全仓 0 失败通过。本地冒烟测试指令 (供 Reviewer 验证):